package com.example.demo01.utils;

import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContextHolder;

public class MessageUtils {
    public static String getMessage(String code,String... args){
        MessageSource messageSource = SpringUtils.getBean(MessageSource.class);
        // 在 DispatcherServlet 的父类 FrameworkServlet#processRequest 处理请求方法中
        // 调用 LocaleContext localeContext = buildLocaleContext(request);实际调用的是 DispatcherServlet#buildLocaleContext 方法
        /**
         *    @Override
         *    protected LocaleContext buildLocaleContext(final HttpServletRequest request) {
         * 		LocaleResolver lr = this.localeResolver;
         * 		if (lr instanceof LocaleContextResolver) {
         * 			return ((LocaleContextResolver) lr).resolveLocaleContext(request);
         *        }
         * 		else {
         * 			return () -> (lr != null ? lr.resolveLocale(request) : request.getLocale());
         *        }
         *    }
         */
        // 获取 LocaleResolver 并返回一个 LocaleContext 的匿名内部类，其中逻辑为调用 LocaleResolver#resolveLocale 解析出 Locale
        // FrameworkServlet#initContextHolders(request, localeContext, requestAttributes);方法表示将 LocaleContext 匿名内部类初始化到 LocaleContextHolder 中
        // 最后调用 LocaleContextHolder.getLocale() 时，就会调用 getLocale(getLocaleContext()); getLocaleContext()表示获取 LocaleContextHolder 中的 LocaleContext
        // 也就是上面的 LocaleContext 匿名内部类 ：() -> (lr != null ? lr.resolveLocale(request) : request.getLocale());
        // getLocale(getLocaleContext()) 中的 getLocale 调用 LocaleContext 的 getLocale 也就是调用 LocaleResolver#resolveLocale 解析出 Locale
        return messageSource.getMessage(code,args, code,LocaleContextHolder.getLocale());
    }
}
